package prog050;

import javax.swing.JOptionPane;

public class Interpolacao {
	private double pontos[];
	private int qtde, tamanho;
	private String matriz[][];
	
	public Interpolacao() {
		qtde = getInt("Insira o número de X");
		tamanho = qtde*2;
		matriz = new String[tamanho][qtde];
		pontos = new double[qtde];
		
		for(int i=0, a= 0;i<qtde;i++,a+=2){
			pontos[i] = getDouble("Insira o ponto x"+i);
			matriz[a][0] = String.valueOf(getDouble("Insira o f(x) para o ponto "+pontos[i]));
		} // ----> Perfeito! ;D
		
		
		interpola();
	}
	
	public String[][] getMatriz(){
		return matriz;
	}
	
	public double[] getPontos(){
		return pontos;
	}
	
	public int getQuantidade(){
		return qtde;
	}
	
	//i = colunas
	//j = linhas
	
	private void interpola(){
		double x, X;
		
		//Pecorrer as linhas
		for(int i=1;i<qtde;i++){ //Pecorre todas as linhas
			//Pecorrer as colunas
			for(int j=i, fim = (tamanho-i);j<fim;j++){
				//Se o j for par, verifica se o i for par, se sim para os 2, escreve o numero
				//Se o j for impar, verfica se o i for impar, se sim para os 2, escreve o numero
				if((isPar(j) && isPar(i)) || (!isPar(j) && !isPar(i))){
					//matriz[j][i] = "a";
					X = diagonalMaior(j, i);
					x = diagonalMenor(j, i);
										
					matriz[j][i] = subtraiPosicoes(matriz[j+1][i-1], matriz[j-1][i-1], X, x);
				}
				else{
					matriz[j][i] = "";
				}
			}
		}
	}

	private boolean isPar(int pos){
		return (pos%2 == 0)? true:false;
	}
	
	private double diagonalMenor(int x, int y){
		int auxX = x, auxY = y;
		
		while(auxX > 0){
			auxX--;
			if(auxY > 0) auxY--;
		}
		
		return pontos[(auxY/2)];
	}
	
	private double diagonalMaior(int x, int y){
		int auxX = x, auxY = y;
		
		while(auxX > 0){
			auxX--;
			auxY++;
		}
		
		return pontos[(auxY/2)];
	}
	
	//Testes
	private void imprimeMatriz(){
		for (int i = 0; i < matriz.length; i++) {
			for (int j = 0; j < matriz[0].length; j++) {
				System.out.print(matriz[i][j]+"\t");
			}
			System.out.println();
		}
	}

	private String subtraiPosicoes(String pos1, String pos2, double X, double x){
		double conta = (Double.parseDouble(pos2) - Double.parseDouble(pos1))/(X-x);
		return String.valueOf(conta);
	}
	
	//Prompts
	private int getInt(String msg){
		return Integer.parseInt(JOptionPane.showInputDialog(msg));
	}
	
	private double getDouble(String msg){
		return Double.parseDouble(JOptionPane.showInputDialog(msg));
	}
}
